Vuejs註:下方 component 和 組件 一詞意思相同。
component 在 Vue 中是一個重要的概念,照 Evan You 所說靈感來源於 Braid、Web component、Ractive,本身是一種抽象(abstraction),我們可以藉此創造 小型、可 複用 的組件,組成組件樹,進一步構建中、大型應用。
以一個簡單的網頁來說,隨著客戶端的功能越來越齊全,許多服務端的程式碼被移到客戶端中,隨著 javascript 程式碼量的增加並且各自連結不同的 HTML、CSS,單純將檔案以 HTML、CSS、Javascript 分離,在複用以及管理上是困難的。

來源:vue 官網,可以看到一拖拉谷的 js
Vue component 概念允許我們將網頁分割成如下方的可複用的 小型 component,每個 component 都包含自己的 HTML、CSS、JavaScript(每個 component 有自己的樣式以及功能),我們可以按照需求將網頁分割成多個 component,並且在合適的時機複用他們,藉此我們可以觀察到 component 將網頁抽象成以一塊一塊的小元件為單位。

來源:vue 官網,可以看到元件化後的網站
按照 官網 所說,component 帶來的「關注點分離」,在現代的 UI 開發中,比起過往將 HTML、CSS、Javascript 各自分離在相互交織的管理方式,component 所帶來一個內部耦合 模板、CSS、JavaScript 的結構在維護性上更高,複用上也更加方便。
Vue 應用在之前幾篇文有提到,會透過一個 根組件 以及可選可嵌套的組件樹組成。

根組件是一個透過建構式創建的 instance new Vue({}),會傳入一組選項物件,全局註冊、局部註冊的 component 可以在該 instance 作為 自定義 元素使用。

每個組件都是可以 複用 的 Vue instance,如何建立一個簡單的組件可以透過全局 API Vue.component('component-name', Vue.extend({option})) 建立,該 option 物件和根組件接收一樣的選項,不同的點在於 el 是根組件特有的選項,選定根組件要掛載的元素,在組件中沒有這個選項。
創建的方式可以透過全局註冊一個組件,這裡我們建立一個自定義的 title <my-title> 組件:
template:會替換 <my-title> 內容為 <h3 style="color: #cfcfcf">{{ word }}</h3>
props:用來接收來自父組件的 data,也就是等等呈現的 title 文字:
接著便可以在根組件中使用該組件 <my-title>:
這裡透過剛剛註冊的自定義 prop word,當我們傳遞 title 給 word attribute 時,該 prop word 便會成為 <my-title> instance 中的 property,藉此我們可以從根組件中傳遞值給 <my-title>,等等會細說 props。

最終呈現的樣貌,組件可以呈現父組件傳入的 title:

data 需要透過函式回傳當我們在使用組件時,要注意 data 需要是透過 function 回傳的物件,這是由於每個組件的 data 皆需要為 獨立 的,透過 function 回傳物件,每個組件對應的 data 皆是一個物件的獨立拷貝。
若是直接設定 data 為物件,組件複用的時候,由於組件對應的 data 是指向同一個物件,於自組件之間的 data 會互相影響。
下面來看看互相影響帶來的問題:
這裡假設一組按鈕元件,每個元件的 data 指向同一個物件,若是 data 中的次數透過按鈕次數可以加一,指向同一物件時,每個元件 instance 會相互影響:


這通常不是我們預期的,所以 Vue 強制了元件的 data 必須是一個由 function 返回的物件。
如下,元件 instance 不會相互影響:


就結論來說,要記得之所以使用 function 返回的物件作為 data,是為了使每個元件 instance 所對應的 data 皆為相互獨立的拷貝,不會互相影響。
剛剛看過了如何在根組件中使用組件後,接著看組件的註冊,組件之所以能夠作為 自定義 元素,在根組件中使用,首先該組件得要被 註冊,這樣組件才能夠被 Vue 辨識,我們才能在根組件模板中使用該 自定義 元素,組件的註冊分成兩種:全局註冊、局部註冊:
組件的全局註冊透過 Vue.component('conponent-name', {}) 創建,透過該方法註冊的組件可以使用在任何的組件中,包含其他的組件、根組件:

一般來說,全局註冊會使用在常常需要在各個元件中使用的基本組件。
說到局部註冊,假如有使用 vue cli 的捧油應該比較常見到局部註冊,比起全局註冊,局部註冊能保障沒有使用一個組件時,該組件不會被 webpack 構建在最終結果,全局註冊組件則是一定會被包含在最終結果中,即使已經沒有使用該全局註冊組件了,仍會增加用戶下載 JavaScript 量的增加。
局部註冊會先定義好組件:

接著在需要用到該局部註冊的組件中,定義該局部註冊組件,也就是 vue cli 常見的組件局部註冊,這之後便可以在此使用此局部註冊組件,模板也能使用其自定義元素。

要記得組件透過局部註冊,無法在其他子組件、非局部註冊組件中使用。這時候,便需要再次局部註冊在想使用的位置。
這次介紹了有關組件的註冊、概念,我們明天見~
若是文中有任何錯誤、錯字、想討論的內容,歡迎各位大大不吝鞭笞指正、交流分享,筆者不慎感激 ✦ ✦ ✦
▶︎ 筆者 github:https://github.com/YUN-RU-TSENG
▶︎ 老王賣瓜之筆者另一篇鐵人:每天來點 CSS Specification
▶︎ 倘若不斷向深處扎根,似乎就能茁壯成長 - RM